# -*- coding: utf-8 -*-
'''
Created on 2020/1/11 11:32
author:dyx
IDE:PyCharm
'''
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense,Dropout
from keras.optimizers import SGD

#载入数据
(x_train,y_train),(x_test,y_test) = mnist.load_data()#(训练集数据，训练集标签),(测试集数据，测试集标签)
#(60000,28,28)
print('x_shape:',x_train.shape)
#(60000)
print('y_shape:',y_train.shape)
#(60000,28,28)->(60000,784)
x_train = x_train.reshape(x_train.shape[0],-1) / 255.0#列数是-1表示不确定，会自动变换成合适的
x_test = x_test.reshape(x_test.shape[0],-1) / 255.0#列数是-1表示不确定，会自动变换成合适的
#转换成one-hot编码形式
y_train = np_utils.to_categorical(y_train,num_classes=10)
y_test = np_utils.to_categorical(y_test,num_classes=10)

#创建模型
model = Sequential([
    Dense(units = 200,input_dim = 784,bias_initializer='one',activation='tanh'),
    Dropout(0.4),#让40%的神经元不工作
    Dense(units = 100,bias_initializer='one',activation='tanh'),
    Dropout(0.4),  # 让40%的神经元不工作
    Dense(units = 10,bias_initializer='one',activation='softmax')
])
#定义优化器
sgd = SGD(lr = 0.2)

#定义优化器，损失函数，训练过程中计算准确率
model.compile(
    optimizer = sgd,
    loss = 'categorical_crossentropy',#在做分类问题时使用交叉熵模型的收敛速度会比较快，通常能达到一个更好的效果
    metrics = ['accuracy']
)
#训练模型
model.fit(x_train,y_train,batch_size = 32,epochs = 10)

#评估模型(测试集)
loss,accuracy = model.evaluate(x_test,y_test)
print('\ntest loss',loss)
print('test accuracy',accuracy)

loss,accuracy = model.evaluate(x_train,y_train)
print('\ntrain loss',loss)
print('train accuracy',accuracy)

